Latviešu

Praktiska rokasgrāmata mantotā koda refaktorēšanai, aptverot identifikāciju, prioritāšu noteikšanu, tehnikas un labākās prakses modernizācijai un uzturamībai.

Zvēra savaldīšana: Mantotā koda refaktorēšanas stratēģijas

Mantots kods. Pats šis termins bieži vien izraisa asociācijas ar plašām, nedokumentētām sistēmām, trauslām atkarībām un milzīgu baiļu sajūtu. Daudzi izstrādātāji visā pasaulē saskaras ar izaicinājumu uzturēt un attīstīt šīs sistēmas, kas bieži vien ir kritiskas uzņēmuma darbībai. Šī visaptverošā rokasgrāmata sniedz praktiskas stratēģijas mantotā koda refaktorēšanai, pārvēršot vilšanās avotu par modernizācijas un uzlabojumu iespēju.

Kas ir mantots kods?

Pirms iedziļināties refaktorēšanas tehnikās, ir svarīgi definēt, ko mēs saprotam ar "mantotu kodu". Lai gan šis termins var vienkārši attiekties uz vecāku kodu, niansētāka definīcija koncentrējas uz tā uzturamību. Maikls Fezers (Michael Feathers) savā fundamentālajā grāmatā "Working Effectively with Legacy Code" definē mantoto kodu kā kodu bez testiem. Šis testu trūkums apgrūtina drošu koda modificēšanu, neieviešot regresijas. Tomēr mantotam kodam var būt arī citas īpašības:

Ir svarīgi atzīmēt, ka mantots kods pats par sevi nav slikts. Tas bieži vien atspoguļo nozīmīgu ieguldījumu un iemieso vērtīgas domēna zināšanas. Refaktorēšanas mērķis ir saglabāt šo vērtību, vienlaikus uzlabojot koda uzturamību, uzticamību un veiktspēju.

Kāpēc refaktorēt mantoto kodu?

Mantotā koda refaktorēšana var būt biedējošs uzdevums, taču ieguvumi bieži vien atsver izaicinājumus. Šeit ir daži galvenie iemesli, kāpēc investēt refaktorēšanā:

Refaktorēšanas kandidātu identificēšana

Ne viss mantotais kods ir jārefaktorē. Ir svarīgi noteikt refaktorēšanas darbu prioritātes, pamatojoties uz šādiem faktoriem:

Piemērs: Iedomājieties globālu loģistikas uzņēmumu ar mantotu sistēmu sūtījumu pārvaldībai. Modulis, kas atbild par piegādes izmaksu aprēķināšanu, tiek bieži atjaunināts mainīgo noteikumu un degvielas cenu dēļ. Šis modulis ir galvenais kandidāts refaktorēšanai.

Refaktorēšanas tehnikas

Ir pieejamas daudzas refaktorēšanas tehnikas, katra paredzēta konkrētu koda "smaržu" novēršanai vai konkrētu koda aspektu uzlabošanai. Šeit ir dažas biežāk izmantotās tehnikas:

Metodes kompozīcija

Šīs tehnikas koncentrējas uz lielu, sarežģītu metožu sadalīšanu mazākās, vieglāk pārvaldāmās metodēs. Tas uzlabo lasāmību, samazina dublēšanos un padara kodu vieglāk testējamu.

Funkciju pārvietošana starp objektiem

Šīs tehnikas koncentrējas uz klašu un objektu dizaina uzlabošanu, pārvietojot atbildības tur, kur tām loģiski jābūt.

Datu organizēšana

Šīs tehnikas koncentrējas uz datu uzglabāšanas un piekļuves veida uzlabošanu, padarot tos vieglāk saprotamus un modificējamus.

Nosacījuma izteiksmju vienkāršošana

Nosacījumu loģika var ātri kļūt sarežģīta. Šo tehniku mērķis ir to precizēt un vienkāršot.

Metodes izsaukumu vienkāršošana

Darbs ar vispārināšanu

Šie ir tikai daži piemēri no daudzajām pieejamajām refaktorēšanas tehnikām. Izvēle, kuru tehniku izmantot, ir atkarīga no konkrētās koda "smaržas" un vēlamā rezultāta.

Piemērs: Gara metode Java lietojumprogrammā, ko izmanto globāla banka, aprēķina procentu likmes. Piemērojot metodes izvilkšanu (Extract Method), lai izveidotu mazākas, mērķtiecīgākas metodes, tiek uzlabota lasāmība un atvieglota procentu likmju aprēķināšanas loģikas atjaunināšana, neietekmējot citas metodes daļas.

Refaktorēšanas process

Refaktorēšanai jāpieiet sistemātiski, lai samazinātu risku un maksimizētu panākumu iespējas. Šeit ir ieteicamais process:

  1. Identificējiet refaktorēšanas kandidātus: Izmantojiet iepriekš minētos kritērijus, lai identificētu koda apgabalus, kuriem refaktorēšana sniegtu vislielāko labumu.
  2. Izveidojiet testus: Pirms veicat jebkādas izmaiņas, uzrakstiet automatizētus testus, lai pārbaudītu koda esošo uzvedību. Tas ir ļoti svarīgi, lai nodrošinātu, ka refaktorēšana neievieš regresijas. Vienību testu (unit tests) rakstīšanai var izmantot tādus rīkus kā JUnit (Java), pytest (Python) vai Jest (JavaScript).
  3. Refaktorējiet pakāpeniski: Veiciet nelielas, pakāpeniskas izmaiņas un palaidiet testus pēc katras izmaiņas. Tas atvieglo jebkuru ieviesto kļūdu identificēšanu un labošanu.
  4. Iesniedziet izmaiņas bieži (Commit Frequently): Bieži iesniedziet savas izmaiņas versiju kontrolē. Tas ļauj viegli atgriezties pie iepriekšējās versijas, ja kaut kas noiet greizi.
  5. Pārskatiet kodu: Lūdziet citam izstrādātājam pārskatīt jūsu kodu. Tas var palīdzēt identificēt potenciālās problēmas un nodrošināt, ka refaktorēšana tiek veikta pareizi.
  6. Pārraugiet veiktspēju: Pēc refaktorēšanas pārraugiet sistēmas veiktspēju, lai nodrošinātu, ka izmaiņas nav izraisījušas veiktspējas regresijas.

Piemērs: Komanda, kas refaktorē Python moduli globālā e-komercijas platformā, izmanto `pytest`, lai izveidotu vienību testus esošajai funkcionalitātei. Pēc tam viņi piemēro klases izvilkšanas (Extract Class) refaktorēšanu, lai atdalītu atbildības un uzlabotu moduļa struktūru. Pēc katras nelielas izmaiņas viņi palaiž testus, lai nodrošinātu, ka funkcionalitāte paliek nemainīga.

Stratēģijas testu ieviešanai mantotā kodā

Kā trāpīgi norādīja Maikls Fezers, mantots kods ir kods bez testiem. Testu ieviešana esošajās kodu bāzēs var šķist milzīgs uzdevums, taču tas ir būtiski drošai refaktorēšanai. Šeit ir vairākas stratēģijas, kā pieiet šim uzdevumam:

Raksturojuma testi (Characterization Tests jeb Golden Master Tests)

Kad saskaraties ar kodu, kas ir grūti saprotams, raksturojuma testi var palīdzēt fiksēt tā esošo uzvedību, pirms sākat veikt izmaiņas. Ideja ir rakstīt testus, kas apstiprina koda pašreizējo izvadi noteiktam ievades datu kopumam. Šie testi ne vienmēr pārbauda pareizību; tie vienkārši dokumentē, ko kods *pašlaik* dara.

Soļi:

  1. Identificējiet koda vienību, kuru vēlaties raksturot (piemēram, funkciju vai metodi).
  2. Izveidojiet ievades vērtību kopu, kas pārstāv virkni bieži sastopamu un robežgadījumu scenāriju.
  3. Palaidiet kodu ar šīm ievadēm un fiksējiet iegūtos rezultātus.
  4. Uzrakstiet testus, kas apgalvo, ka kods rada tieši šos rezultātus šīm ievadēm.

Uzmanību: Raksturojuma testi var būt trausli, ja pamatā esošā loģika ir sarežģīta vai atkarīga no datiem. Esiet gatavi tos atjaunināt, ja vēlāk nepieciešams mainīt koda uzvedību.

Asna metode un asna klase (Sprout Method and Sprout Class)

Šīs tehnikas, ko arī aprakstījis Maikls Fezers, mērķis ir ieviest jaunu funkcionalitāti mantotā sistēmā, vienlaikus samazinot risku sabojāt esošo kodu.

Asna metode: Kad nepieciešams pievienot jaunu funkciju, kas prasa modificēt esošu metodi, izveidojiet jaunu metodi, kas satur jauno loģiku. Pēc tam izsauciet šo jauno metodi no esošās metodes. Tas ļauj izolēt jauno kodu un testēt to neatkarīgi.

Asna klase: Līdzīgi kā asna metode, bet attiecas uz klasēm. Izveidojiet jaunu klasi, kas implementē jauno funkcionalitāti, un pēc tam integrējiet to esošajā sistēmā.

Izolētā vide (Sandboxing)

Izolētā vide ietver mantotā koda izolēšanu no pārējās sistēmas, ļaujot to testēt kontrolētā vidē. To var izdarīt, izveidojot atkarību aizstājējus (mocks) vai prototipus (stubs), vai palaižot kodu virtuālajā mašīnā.

Mikado metode

Mikado metode ir vizuāla problēmu risināšanas pieeja sarežģītu refaktorēšanas uzdevumu risināšanai. Tā ietver diagrammas izveidi, kas attēlo atkarības starp dažādām koda daļām, un pēc tam koda refaktorēšanu tādā veidā, kas samazina ietekmi uz citām sistēmas daļām. Pamatprincips ir "izmēģināt" izmaiņas un redzēt, kas salūzt. Ja kaut kas salūzt, atgriezieties pie pēdējā strādājošā stāvokļa un pierakstiet problēmu. Pēc tam risiniet šo problēmu, pirms atkārtoti mēģināt veikt sākotnējās izmaiņas.

Rīki refaktorēšanai

Vairāki rīki var palīdzēt refaktorēšanā, automatizējot atkārtotus uzdevumus un sniedzot norādījumus par labākajām praksēm. Šie rīki bieži ir integrēti integrētajās izstrādes vidēs (IDE):

Piemērs: Izstrādes komanda, kas strādā pie C# lietojumprogrammas globālam apdrošināšanas uzņēmumam, izmanto Visual Studio iebūvētos refaktorēšanas rīkus, lai automātiski pārdēvētu mainīgos un izvilktu metodes. Viņi arī izmanto SonarQube, lai identificētu koda "smaržas" un potenciālās ievainojamības.

Izaicinājumi un riski

Mantotā koda refaktorēšana nav bez izaicinājumiem un riskiem:

Labākās prakses

Lai mazinātu izaicinājumus un riskus, kas saistīti ar mantotā koda refaktorēšanu, ievērojiet šīs labākās prakses:

Noslēgums

Mantotā koda refaktorēšana ir izaicinošs, bet atalgojošs darbs. Ievērojot šajā rokasgrāmatā izklāstītās stratēģijas un labākās prakses, jūs varat savaldīt zvēru un pārveidot savas mantotās sistēmas par uzturamiem, uzticamiem un augstas veiktspējas aktīviem. Atcerieties pieiet refaktorēšanai sistemātiski, bieži testēt un efektīvi komunicēt ar savu komandu. Ar rūpīgu plānošanu un izpildi jūs varat atraisīt slēpto potenciālu savā mantotajā kodā un bruģēt ceļu nākotnes inovācijām.